home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HTBasic 9.3
/
HTBasic 9.3.iso
/
83win
/
data1.cab
/
Basic_Plus_Examples
/
RCKSCIPR
< prev
next >
Wrap
Text File
|
2001-03-02
|
9KB
|
252 lines
10 ! ******************************************************************
20 ! Example: Rock/Paper/Scissors Game
30 !
40 ! This program is designed to show the operation of LABEL and
50 ! PUSHBUTTON widgets. It plays the game of "rock/paper/scissors"
60 ! in which each of two players guesses one of three items -
70 ! rock, paper, or scissors. The guesses are then compared
80 ! for the following outcomes:
90 !
100 ! - An identical guess is a tie
110 ! - Paper covers rock, paper wins
120 ! - Scissors cuts paper, scissors wins
130 ! - Rock breaks scissors, rock wins
140 !
150 ! The program sets up a panel with a large LABEL to prompt the user
160 ! for his or her guess, sets up a PUSHBUTTON for each guess, then
170 ! goes into a loop where it waits for PUSHBUTTON input.
180 !
190 ! Each one of the three PUSHBUTTON widgets causes an event that invokes
200 ! the appropriate handler routine. These three routines each contain
210 ! a SELECT statement that matches the PUSHBUTTON against a guess made
220 ! by the program -- rock, scissors, or paper. On the basis of the
230 ! match, each routine then provides a dialog indicating the match and
240 ! calls the appropriate Win, Lose, or Tie routine.
250 !
260 ! ******************************************************************
270 !
280 RANDOMIZE INT(FRACT(TIMEDATE)*10^7)
290 !
300 ! Variables Used:
310 !
320 ! Me,You,Tie: Store game outcomes
330 ! Rock,Paper,Scissors: Guess values
340 ! B$,S$: General purpose strings
350 !
360 INTEGER Me,You,Tie,Rock,Paper,Scissors
370 DATA 0,0,0,0,1,2
380 READ Me,You,Tie,Rock,Paper,Scissors
390 !
400 INTEGER Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
410 DATA 0,1,2,3,4,5,6,7
420 READ Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
430 !
440 DIM B$[50],S$[100]
450 INTEGER Nlines,D(1:4),Dw,Dh ! Variables for display handling
460 INTEGER Pw,Ph,Px,Py,Iw,Ih ! PANEL dimensions & coordinates
470 INTEGER Gapw,Gaph,W1,H1,W2,H2 ! Widget scaling factors
480 INTEGER R1,R2,R3,R4,R5,R6,C1,C2,C3
490 !
500 ! Get display dimensions
510 !
520 STATUS CRT,13;Nlines
530 GESCAPE CRT,3;D(*)
540 Dw=D(3)-D(1)
550 Dh=(D(4)-D(2))*((Nlines-7)/Nlines)
560 !
570 Pw=Dw*.5
580 Ph=Dh*.8
590 Px=(Dw-Pw)/2
600 Py=(Dh-Ph)/2
610 !
620 CLEAR SCREEN
630 ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
640 CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
650 CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
660 CONTROL @Main;SET ("TITLE":" Example: Rock/Paper/Scissors Game")
670 CONTROL @Main;SET ("SYSTEM MENU":"Quit")
680 !
690 STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
700 !
710 Gapw=Iw*.03 ! Width gap
720 Gaph=Ih*.03 ! Height gap
730 W1=(Iw-Gapw*4)/3 ! Width of PUSHBUTTONs and most LABELS
740 H1=(Ih-Gaph*8)/4 ! Height of PUSHBUTTONs and all LABELS
750 W2=Iw-Gapw*2 ! Width of main LABEL and all SEPARATORs
760 H2=Gaph ! Height of SEPARATORs
770 !
780 C1=Gapw ! Column coordinates, based on PUSHBUTTON width
790 C2=C1+W1+Gapw
800 C3=C2+W1+Gapw
810 !
820 R1=Gaph ! Row coordinates: row for main LABEL
830 R2=R1+H1+Gaph ! Row for first SEPARATOR
840 R3=R2+H2+Gaph ! Row for input PUSHBUTTONs
850 R4=R3+H1+Gaph ! Row for second SEPARATOR
860 R5=R4+H2 ! Row for result-title LABELs
870 R6=R5+H1 ! Row for result-value LABELs
880 !
890 ! Now add child widgets: main LABEL
900 !
910 ASSIGN @Label TO WIDGET "LABEL";PARENT @Main
920 CONTROL @Label;SET ("X":C1,"Y":R1,"WIDTH":W2,"HEIGHT":H1)
930 CONTROL @Label;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
940 CONTROL @Label;SET ("PEN":White,"VALUE":"Make a guess!")
950 !
960 ! Create SEPARATOR widget
970 !
980 ASSIGN @S1 TO WIDGET "SEPARATOR";PARENT @Main
990 CONTROL @S1;SET ("X":C1,"Y":R2,"WIDTH":W2,"HEIGHT":H2)
1000 !
1010 ! User input keys
1020 !
1030 ASSIGN @Rock TO WIDGET "PUSHBUTTON";PARENT @Main
1040 CONTROL @Rock;SET ("X":C1,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
1050 CONTROL @Rock;SET ("BACKGROUND":Blue,"PEN":White)
1060 CONTROL @Rock;SET ("LABEL":"ROCK")
1070 !
1080 ASSIGN @Scissors TO WIDGET "PUSHBUTTON";PARENT @Main
1090 CONTROL @Scissors;SET ("X":C2,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
1100 CONTROL @Scissors;SET ("BACKGROUND":Blue,"PEN":White)
1110 CONTROL @Scissors;SET ("LABEL":"SCISSORS")
1120 !
1130 ASSIGN @Paper TO WIDGET "PUSHBUTTON";PARENT @Main
1140 CONTROL @Paper;SET ("X":C3,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
1150 CONTROL @Paper;SET ("BACKGROUND":Blue,"PEN":White)
1160 CONTROL @Paper;SET ("LABEL":"PAPER")
1170 !
1180 ! Next SEPARATOR widget
1190 !
1200 ASSIGN @S2 TO WIDGET "SEPARATOR";PARENT @Main
1210 CONTROL @S2;SET ("X":C1,"Y":R4,"WIDTH":W2,"HEIGHT":H2)
1220 !
1230 ! Results titles and values. Note that none of these LABELS have
1240 ! borders; the titles also have backgrounds that have the same color
1250 ! as the PANEL background, so they appear to be written directly on
1260 ! the PANEL.
1270 !
1280 ASSIGN @Me_title TO WIDGET "LABEL";PARENT @Main
1290 CONTROL @Me_title;SET ("X":C1,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
1300 CONTROL @Me_title;SET ("BORDER":0,"VALUE":"ME")
1310 !
1320 ASSIGN @Me_value TO WIDGET "LABEL";PARENT @Main
1330 CONTROL @Me_value;SET ("X":C1,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
1340 CONTROL @Me_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
1350 CONTROL @Me_value;SET ("VALUE":Me)
1360 !
1370 ASSIGN @You_title TO WIDGET "LABEL";PARENT @Main
1380 CONTROL @You_title;SET ("X":C2,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
1390 CONTROL @You_title;SET ("BORDER":0,"VALUE":"YOU")
1400 !
1410 ASSIGN @You_value TO WIDGET "LABEL";PARENT @Main
1420 CONTROL @You_value;SET ("X":C2,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
1430 CONTROL @You_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Green)
1440 CONTROL @You_value;SET ("VALUE":You)
1450 !
1460 ASSIGN @Tie_title TO WIDGET "LABEL";PARENT @Main
1470 CONTROL @Tie_title;SET ("X":C3,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
1480 CONTROL @Tie_title;SET ("BORDER":0,"VALUE":"TIE")
1490 !
1500 ASSIGN @Tie_value TO WIDGET "LABEL";PARENT @Main
1510 CONTROL @Tie_value;SET ("X":C3,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
1520 CONTROL @Tie_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Yellow)
1530 CONTROL @Tie_value;SET ("VALUE":Tie)
1540 !
1550 ! PANEL completed, set up EVENTS
1560 !
1570 ON EVENT @Rock,"ACTIVATED" GOSUB Gotrock
1580 ON EVENT @Scissors,"ACTIVATED" GOSUB Gotscissors
1590 ON EVENT @Paper,"ACTIVATED" GOSUB Gotpaper
1600 ON EVENT @Main,"SYSTEM MENU" GOTO Finis
1610 !
1620 ! Turn on the PANEL, make everything visible, then loop
1630 !
1640 CONTROL @Main;SET ("VISIBLE":1)
1650 !
1660 ! Main loop, set random-number seed, then loop
1670 !
1680 LOOP
1690 WAIT FOR EVENT
1700 END LOOP
1710 STOP
1720 !
1730 ! **************** End of Main Program **********************
1740 !
1750 ! The three following handler routines are all basically similar:
1760 ! each is invoked by one of the three PUSHBUTTONs and uses a SELECT
1770 ! statement to figure the appropriate outcome. For each outcome, it
1780 ! loads a string with the appropriate result and calls the appropriate
1790 ! Win, Lose, or Tie routine.
1800 !
1810 Gotrock: !
1820 SELECT INT(3*RND)
1830 CASE Rock
1840 B$="ROCK ON ROCK"
1850 GOSUB Tie
1860 CASE Scissors
1870 B$="ROCK BREAKS SCISSORS"
1880 GOSUB Win
1890 CASE Paper
1900 B$="PAPER COVERS ROCK"
1910 GOSUB Lose
1920 END SELECT
1930 RETURN
1940 !
1950 Gotscissors: !
1960 SELECT INT(3*RND)
1970 CASE Rock
1980 B$="ROCK BREAKS SCISSORS"
1990 GOSUB Lose
2000 CASE Scissors
2010 B$="SCISSORS ON SCISSORS"
2020 GOSUB Tie
2030 CASE Paper
2040 B$="SCISSORS CUTS PAPER"
2050 GOSUB Win
2060 END SELECT
2070 RETURN
2080 !
2090 Gotpaper: !
2100 SELECT INT(3*RND)
2110 CASE Rock
2120 B$="PAPER COVERS ROCK"
2130 GOSUB Win
2140 CASE Scissors
2150 B$="SCISSORS CUTS PAPER"
2160 GOSUB Lose
2170 CASE Paper
2180 B$="PAPER ON PAPER"
2190 GOSUB Tie
2200 END SELECT
2210 RETURN
2220 !
2230 ! The three results routines -- Win, Tie, Lose -- are also similar to
2240 ! each other. Each takes the result of the match from the calling
2250 ! routine, concatenates it with the appropriate conclusion, displays
2260 ! it with a dialog, then increments the appropriate tally and returns.
2270 !
2280 Win: !
2290 S$=B$&": You WIN!"
2300 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Green)
2310 You=You+1
2320 CONTROL @You_value;SET ("VALUE":You)
2330 RETURN
2340 !
2350 Tie: !
2360 S$=B$&": Tie!"
2370 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Yellow)
2380 Tie=Tie+1
2390 CONTROL @Tie_value;SET ("VALUE":Tie)
2400 RETURN
2410 !
2420 Lose: !
2430 S$=B$&": You LOSE!"
2440 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Red)
2450 Me=Me+1
2460 CONTROL @Me_value;SET ("VALUE":Me)
2470 RETURN
2480 !
2490 Finis: !
2500 ASSIGN @Main TO * ! Delete the PANEL widget
2510 END